export default class Comparator {
  /**
   * 构造函数。
   * @param {function(a: *, b: *)} [compareFunction] - 可选的自定义比较函数，用于比较自定义对象。
   */
  constructor(compareFunction) {
    this.compare = compareFunction || Comparator.defaultCompareFunction;
  }

  /**
   * 默认比较函数。假设 "a" 和 "b" 是字符串或数字。
   * @param {(string|number)} a - 第一个比较项
   * @param {(string|number)} b - 第二个比较项
   * @returns {number} - 返回 0 表示相等，-1 表示 a 小于 b，1 表示 a 大于 b
   */
  static defaultCompareFunction(a, b) {
    if (a === b) {
      return 0;
    }

    return a < b ? -1 : 1;
  }

  /**
   * 检查两个变量是否相等。
   * @param {*} a - 第一个比较项
   * @param {*} b - 第二个比较项
   * @return {boolean} - 返回 true 如果 a 等于 b，否则返回 false
   */
  equal(a, b) {
    return this.compare(a, b) === 0;
  }

  /**
   * 检查变量 "a" 是否小于 "b"。
   * @param {*} a - 第一个比较项
   * @param {*} b - 第二个比较项
   * @return {boolean} - 返回 true 如果 a 小于 b，否则返回 false
   */
  lessThan(a, b) {
    return this.compare(a, b) < 0;
  }

  /**
   * 检查变量 "a" 是否大于 "b"。
   * @param {*} a - 第一个比较项
   * @param {*} b - 第二个比较项
   * @return {boolean} - 返回 true 如果 a 大于 b，否则返回 false
   */
  greaterThan(a, b) {
    return this.compare(a, b) > 0;
  }

  /**
   * 检查变量 "a" 是否小于等于 "b"。
   * @param {*} a - 第一个比较项
   * @param {*} b - 第二个比较项
   * @return {boolean} - 返回 true 如果 a 小于或等于 b，否则返回 false
   */
  lessThanOrEqual(a, b) {
    return this.lessThan(a, b) || this.equal(a, b);
  }

  /**
   * 检查变量 "a" 是否大于等于 "b"。
   * @param {*} a - 第一个比较项
   * @param {*} b - 第二个比较项
   * @return {boolean} - 返回 true 如果 a 大于或等于 b，否则返回 false
   */
  greaterThanOrEqual(a, b) {
    return this.greaterThan(a, b) || this.equal(a, b);
  }

  /**
   * 反转比较顺序。
   */
  reverse() {
    const compareOriginal = this.compare;
    this.compare = (a, b) => compareOriginal(b, a);
  }
}
